package demo2

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
	"time"
)

/*
	Go语言可以对任何类型添加方法。给一种类型添加方法就像给结构体添加方法一样，因为结构体也是一种类型。
	  1. 使用 type 关键字可以定义出新的自定义类型。之后就可以为自定义类型添加各种方法
*/

// 将int定义为MyInt类型
type myInt int

// 为MyInt添加IsZero()方法
func (m myInt) IsZero() bool {
	return m == 0
}

// 为MyInt添加Add()方法
func (m myInt) Add(other int) int {
	return int(m) + other
}

// TestDemo213 任何类型添加方法
func TestDemo213() {
	/* demo1 */
	var b myInt
	fmt.Println("b 是否为0：", b.IsZero())
	b = 1
	fmt.Println("b + 2: ", b.Add(2))

	/* demo2 */
	client := &http.Client{}

	// 创建一个http请求, 不会连接网络。
	req, err := http.NewRequest("POST", "http://www.163.com/", strings.NewReader("key=value"))

	// 发现错误就打印出来
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
		return
	}

	// 为标头添加信息, 添加代理
	req.Header.Add("User-Agent", "myClient")

	// 开始请求
	resp, err := client.Do(req)

	// 处理请求的错误
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
		return
	}

	data, err := ioutil.ReadAll(resp.Body)
	fmt.Println(string(data))

	defer resp.Body.Close()

	/* demo3: time 包中的类型方法 */
	fmt.Println(time.Second.String())

}
